cmake_minimum_required(VERSION 3.10)
project(base)

set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED True)

###############################################################################################
# TOOLCHAINS
###############################################################################################
# target_compile_definitions(base PUBLIC
#    $<$<PLATFORM_ID:Linux>:CMAKE_COMPILER_TOOLCHAIN_PATH="/usr/bin">
#    $<$<PLATFORM_ID:Windows>:CMAKE_COMPILER_TOOLCHAIN_PATH="D:/MinGW/bin">
#    )

# cross compiler
# set(CMAKE_COMPILER_TOOLCHAIN_PATH /home/jiehua/stm32/toolchains/gcc-arm-none-eabi-5_4-2016q3/bin)
# message(STATUS ${CMAKE_COMPILER_TOOLCHAIN_PATH})
# set(CMAKE_C_COMPILER ${CMAKE_COMPILER_TOOLCHAIN_PATH}/arm-none-eabi-gcc)
# set(CMAKE_CXX_COMPILER ${CMAKE_COMPILER_TOOLCHAIN_PATH}/arm-none-eabi-g++)
# set(CMAKE_OBJCOPY ${CMAKE_COMPILER_TOOLCHAIN_PATH}/arm-none-eabi-objcopy)
# set(CMAKE_SIZE ${CMAKE_COMPILER_TOOLCHAIN_PATH}/arm-none-eabi-size)

# find_program(CMAKE_C_COMPILER arm-none-eabi-gcc ${CMAKE_COMPILER_TOOLCHAIN_PATH})
# find_program(CMAKE_CXX_COMPILER arm-none-eabi-g++ ${CMAKE_COMPILER_TOOLCHAIN_PATH})
# find_program(CMAKE_OBJCOPY arm-none-eabi-objcopy ${CMAKE_COMPILER_TOOLCHAIN_PATH})
# find_program(CMAKE_SIZE arm-none-eabi-size ${CMAKE_COMPILER_TOOLCHAIN_PATH})

# compiler
# set(CMAKE_COMPILER_TOOLCHAIN_PATH /usr/bin)
# set(CMAKE_COMPILER_TOOLCHAIN_PATH D:\\Programs\\w64devkit-1.21.0\\bin) # 报错
set(CMAKE_COMPILER_TOOLCHAIN_PATH D:\\MinGW\\bin)
# set(CMAKE_GENERATOR "MinGW Makefiles")

if(WIN32)
    set(CMAKE_GENERATOR "MinGW Makefiles")
    message("Windows" )
elseif(UNIX AND NOT APPLE)
    set(CMAKE_GENERATOR "Unix Makefiles")
    message("Linux" )
else()
    message("Warning not Windows or Linux" )
endif()
# message("platform id :  "${PLATFORM_ID:Linux})
message(STATUS "tool chains path : " ${CMAKE_COMPILER_TOOLCHAIN_PATH})

set(CMAKE_C_COMPILER ${CMAKE_COMPILER_TOOLCHAIN_PATH}/gcc)
set(CMAKE_CXX_COMPILER ${CMAKE_COMPILER_TOOLCHAIN_PATH}/g++)
set(CMAKE_OBJCOPY ${CMAKE_COMPILER_TOOLCHAIN_PATH}/objcopy)
set(CMAKE_SIZE ${CMAKE_COMPILER_TOOLCHAIN_PATH}/size)


###############################################################################################
# DEFINITIONS
###############################################################################################
add_definitions(
# -DUSE_STDPERIPH_DRIVER
)

###############################################################################################
# CFLAGS
###############################################################################################
#set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_C_FLAGS "-w -Wno-unknown-pragmas -Wall -fdata-sections -ffunction-sections")
set(CMAKE_C_FLAGS_DEBUG "-O0 -g2 -ggdb")
set(CMAKE_C_FLAGS_RELEASE "-O3")

###############################################################################################
# LDFLAGS
###############################################################################################
set(CMAKE_EXE_LINKER_FLAGS 
# "-specs=nano.specs -T${LINKER_SCRIPT} -Wl,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map,--cref -Wl,--gc-sections"
"-Wl,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map,--cref -Wl,--gc-sections"
)

###############################################################################################
# INCLUDES
###############################################################################################
include_directories(
    structs
    ${CMAKE_CURRENT_BINARY_DIR}
)

###############################################################################################
# LIBRARYS
###############################################################################################
add_subdirectory(structs)

###############################################################################################
# SOURCES
###############################################################################################
set(SRC 
    main.cpp
)

###############################################################################################
# BUILD
###############################################################################################
add_executable(${PROJECT_NAME}.elf ${SRC})
target_link_libraries(${PROJECT_NAME}.elf
    # -lm -lc structs
    # -lm -lmsvcrt structs
    structs
)

###############################################################################################
# POST BUILD
###############################################################################################
# set(ELF_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.elf)
# set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex)
# set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin)

# add_custom_command(TARGET "${PROJECT_NAME}.elf" POST_BUILD
#     COMMAND ${CMAKE_OBJCOPY} -O binary -S ${ELF_FILE} ${BIN_FILE}
#     COMMAND ${CMAKE_OBJCOPY} -O ihex  ${ELF_FILE} ${HEX_FILE}
#     COMMENT "Building ${PROJECT_NAME}.bin and ${PROJECT_NAME}.hex"

#     COMMAND ${CMAKE_COMMAND} -E copy ${HEX_FILE} "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.hex"
#     COMMAND ${CMAKE_COMMAND} -E copy ${BIN_FILE} "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.bin"

#     COMMAND ${CMAKE_SIZE} --format=berkeley ${PROJECT_NAME}.elf ${PROJECT_NAME}.hex
#     COMMENT "Invoking: Cross ARM GNU Print Size"
# )
